package top.infopub.mgc.core.sender.sms;


import java.net.URLEncoder;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import top.infopub.common.ErrorCodeEnum;
import top.infopub.httpclient.base.HttpBizRsp;
import top.infopub.httpclient.base.HttpEnum;
import top.infopub.httpclient.proxy.HttpClientProxy;
import top.infopub.mgc.core.domain.PartnerInfoDomain;
import top.infopub.mgc.core.service.PartnerInfoService;
import top.infopub.mgc.util.EnviornConfig;
import top.infopub.vo.ResponseVo;


/**
 * UMS供应商-短信发送工具类  -- 弃用供应商
 * @author Awoke
 * @version 2018-10-14
 * @see SmsSenderUms
 * @since
 */
@Component
public class SmsSenderUms {

    private static final Logger log = LoggerFactory.getLogger(SmsSenderUms.class);

    @Resource
    private EnviornConfig env;

    @Autowired
    private PartnerInfoService partnerInfoService;

    /** partner-code **/
    private static final String PARTNER_CODE_SMS_UMS = "MGC_PARTNER_SMS_UMS";

    /**
     * 下发短信 <br/>
     * @param mobiles   手机号  多个号码用”,”分隔，最多1000个号码
     * @param content   短信内容
     * @param msgid     状态报告标识符      
     * @see
     */
    @SuppressWarnings("unchecked")
    public ResponseVo<String> sendMessage(String mobiles, String content, String msgid) {
        try {
            if (!env.isProduction()) {
                return ResponseVo.getSuccessResponse();
            }
            PartnerInfoDomain partnerInfo = partnerInfoService.getPartnerCache(PARTNER_CODE_SMS_UMS);
            PartnerInfoDomain.Sms smsInfo = partnerInfo.getSms();

            StringBuilder att = new StringBuilder();
            // 企业编号
            att.append("SpCode=").append(smsInfo.getSpCode());
            // 用户名称
            att.append("&LoginName=").append(partnerInfo.getSpartnerAccName());
            // 用户密码 (有可能含有url字符，需encode)
            att.append("&Password=").append(
                URLEncoder.encode(partnerInfo.getSpartnerAccPassword(),
                    HttpEnum.CharSet.GBK.getCharset()));
            // 手机号码(多个号码用”,”分隔)，最多1000个号码
            att.append("&UserNumber=").append(mobiles);
            // 短信内容, 最大700个字符 (有可能含有url字符，需encode)
            att.append("&MessageContent=").append(
                URLEncoder.encode(content, HttpEnum.CharSet.GBK.getCharset()));
            // 流水号，20位数字，唯一 
            att.append("&SerialNumber=").append(msgid);

            // 注意：由于SP API要求，此处字符集必须是GBK
            HttpBizRsp rsp = HttpClientProxy.req(smsInfo.getSendUrl(), HttpEnum.Method.POST,
                HttpEnum.CharSet.GBK, HttpEnum.MimeType.FORM, att.toString());
            if (rsp.isOk()) {
                String result = rsp.getData();
                // 网关返回结果     result=&description=错误描述&faillist=失败号码列表
                // result=0说明下发到网关成功，  其他见SDK相关文档。
                log.info("sendMessage to:{} >> content:{}, msgid:{}, result:{}", new Object[] {
                    mobiles, content, msgid, result});
                // 解析返回结果
                String state = result.split("&")[0].split("=")[1];
                if (StringUtils.equals("0", state)) {
                    return ResponseVo.getSuccessResponse();
                }
                else {
                    // 下发网关失败，直接返回异常
                    return ErrorCodeEnum.ERROR_MGC_SENDSMS.getResponseVo(result);
                }
            }
            else {
                return ErrorCodeEnum.ERROR_MGC_SENDSMS.getResponseVo(rsp.getData());
            }
        }
        catch (Exception e) {
            log.error("sendMessage error", e);
            return ErrorCodeEnum.ERROR_MGC_SENDSMS.getResponseVo(e.getClass().getName() + " "
                                                                 + e.getMessage());
        }
    }

    /**
     * 短信状态报告 </br>
     * 由于状态报告的不及时和不可控，暂时不处理状态报告，短信对账功能由原UMS平台提供
     * @return String  
     * 回执结果，每条回执按分号隔开，每个字段按逗号隔开，
     * 每条回执共包含3个字段，第1个字段为流水号，第2个字段为被发送的手机号码，
     * 第3个字段为回执结果，0表示成功，其他值表示失败
     * @throws Exception 
     * @see
     */
    public String msgReports(String msgid)
        throws Exception {
        if (!env.isProduction()) {
            return null;
        }
        PartnerInfoDomain partnerInfo = partnerInfoService.getPartnerCache(PARTNER_CODE_SMS_UMS);
        PartnerInfoDomain.Sms smsInfo = partnerInfo.getSms();

        StringBuilder att = new StringBuilder();
        // 企业编号
        att.append("SpCode=").append(smsInfo.getSpCode());
        // 用户名称
        att.append("&LoginName=").append(partnerInfo.getSpartnerAccName());
        // 用户密码
        att.append("&Password=").append(partnerInfo.getSpartnerAccPassword());
        // 发送时的流水号
        att.append("&SerialNumber=").append(msgid);

        // 注意：由于SP API要求，此处字符集必须是GBK
        HttpBizRsp rsp = HttpClientProxy.req(smsInfo.getReportUrl(), HttpEnum.Method.POST,
            HttpEnum.CharSet.GBK, HttpEnum.MimeType.FORM, att.toString());
        log.debug("get reports:{} ", rsp);
        return rsp.getData();
    }

    /**
     * Test
     * @param args
     */
    public static void main(String[] args)
        throws Exception {
        // result=0&description=发送短信成功&taskid=10135928726&faillist=&task_id=10135928726
        // 调用方法
        // log.info(sendMessage("15951899194", "您的验证码为：1234", "1"));
    }
}
